package top.littlefogcat.clickerx.home.model.repo

import top.littlefogcat.clickerx.base.constants.FlavorConstants
import top.littlefogcat.clickerx.base.entities.Chat
import top.littlefogcat.clickerx.base.entities.Message
import top.littlefogcat.clickerx.base.utils.Mocker
import top.littlefogcat.clickerx.home.model.datasource.MessageDataSource
import top.littlefogcat.clinj.InjectSrc
import top.littlefogcat.common.utils.DateUtil
import top.littlefogcat.network.NetResult
import kotlin.random.Random

@InjectSrc(FlavorConstants.NAME_MESSAGE_DS, FlavorConstants.FLAVOR_MOCK)
object MessageRepositoryMock : MessageDataSource {

    override suspend fun loadChatList(): NetResult<List<Chat>> {
        return NetResult.Success(MockMessageCreator.createChatList())
    }

    object MockMessageCreator {
        private val random = Random.Default

        fun createChatList(): ArrayList<Chat> {
            return arrayListOf(
                Chat(0, Chat.TYPE_PERSONAL, 0, "系统消息", Mocker.avatar(), createMessageList(0)),
                Chat(1, Chat.TYPE_PERSONAL, 0, "通知", Mocker.avatar(), createMessageList(2)),
                Chat(2, Chat.TYPE_PERSONAL, 0, "管理员", Mocker.avatar(), createMessageList(3)),
                Chat(3, Chat.TYPE_PERSONAL, 0, "小花", Mocker.avatar(), createMessageList(4)),
                Chat(4, Chat.TYPE_PERSONAL, 0, "小红", Mocker.avatar(), createMessageList(5)),
                Chat(5, Chat.TYPE_PERSONAL, 0, "小刚", Mocker.avatar(), createMessageList(6)),
                Chat(6, Chat.TYPE_PERSONAL, 0, "孝感", Mocker.avatar(), createMessageList(7)),
                Chat(7, Chat.TYPE_PERSONAL, 0, "聊过", Mocker.avatar(), createMessageList(8)),
                Chat(8, Chat.TYPE_PERSONAL, 0, "周至县", Mocker.avatar(), createMessageList(9)),
                Chat(9, Chat.TYPE_PERSONAL, 0, "李玉梅", Mocker.avatar(), createMessageList(10)),
                Chat(10, Chat.TYPE_PERSONAL, 0, "马尼", Mocker.avatar(), createMessageList(11)),
                Chat(11, Chat.TYPE_PERSONAL, 0, "张鹏", Mocker.avatar(), createMessageList(12)),
                Chat(12, Chat.TYPE_PERSONAL, 0, "苏联", Mocker.avatar(), createMessageList(13)),
                Chat(13, Chat.TYPE_PERSONAL, 0, "美丽", Mocker.avatar(), createMessageList(14)),
                Chat(14, Chat.TYPE_PERSONAL, 0, "嘤", Mocker.avatar(), createMessageList(15)),
            )
        }

        private val messages = arrayOf(
            "被删除，因多次违规你被禁言7天",
            "你好，很高兴认识你",
            "你好，很不高兴认识你",
            "已经升级至lv.7",
            "亲爱的 niuu 你好，因...",
            "消息列表的主要目的在于使用户获取消息，并完成处理，不同的软件对于消息的要求也不尽相同。",
            "即时通信类软件在于使用户尽可能快的获取和处理信息，同时保证私密性。",
            "资讯社交类软件在于传达主流程之外产生消息，目的在更好的辅助用户完成主流程，微博、知乎的点赞即是此类逻辑；工具类软件产生的消息，多为系统通知、或工具主流程需要通知的信息。",
            "但是其中设计消息的通用原则、用户获取并处理消息的流程是相通的。",
            "所以我们在设计消息列表的时候，应该同时考虑到这些通用的内容以及不同类型软件对消息需求的不同。因地制宜，才能设计出一个便捷高效的消息列表。",
            "在消息列表设计的过程中需遵循以下三个原则进行设计：\n" +
                    "\n" +
                    "即时性（快速获取，阅读以及处理）\n" +
                    "避免产生骚扰（避免消息过于频繁给用户带来骚扰）\n" +
                    "私密性（防止信息泄露）",
            "（一）即时通信类：\n" +
                    "以微信为例， 微信是一款跨平台的通讯工具。支持单人、多人参与。通过手机网络发送语音、图片、视频和文字。他定位于通讯工具，用户在使用软件时的主流程即为获取消息，并快速处理。",
            "即时性：所以微信将消息作为一个单独的Tab，并以红点+数字的形式进行强提醒。同时在桌面通知中，\n" +
                    "防打扰：应用图标提醒数目为消息列表中未为处理的总数，避免了其他消息的打扰（朋友圈、系统通知等）。仅用户自身聊天的消息推送，系统不会推送内容。\n" +
                    "私密性：用户可以设置是否显示通知消息详情。（即使显示详情，在收到红包时和转账，也会进行相应的私密处理）",
            "即时通讯类软件需遵循的设计原则：\n" +
                    "\n" +
                    "有独立消息主tab（使用软件的核心流程）\n" +
                    "消息的获取，以即时性为最高要求，越快越好\n" +
                    "消息组织类型为以通信对象为单位，内部包含行为信息（@，红包、语音、小视频）\n" +
                    "系统通知消息优先级低于用户消息\n" +
                    "用户敏感信息进行保护处理\n" +
                    "严格控制推送内容，避免打扰到用户",
            "以微博为例， 微博：用一句话随意记录生活，用手机随时随地发微博。",
            "迅速获取最热最火最快最酷最新的资讯。",
            "用户使用产品的主要场景为获取短资讯，在获取资讯的同时，产生交流互动。",
            "可见消息的获取为主流程之外的附加流程，所以微博有一个单独的消息列表，位于第二个。",
            "即时性：赞和@为非即时性消息，是进行合并后推送的消息，也可以通过主动拉去消息获得。用户间的聊天内容为即时通信。",
            "嗯", "哦", "好", "没事", "ok", "是吗？", "哈哈", "哈哈哈", "呜呜", "不行", "不想", "难受", "起床啦", "好饱", "吃了吗",
            "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈", "吃哩甚", "可以", "不可以",
            "啥", "没有", "什么", "不是", "什么鬼", "困", "对", "不知道", "算了", "66666", "哭了", "笑了", "笑死", "笑死了", "凶死了",
            "嗯", "哦", "好", "没事", "ok", "是吗？", "哈哈", "哈哈哈", "呜呜", "不行", "不想", "难受", "起床啦", "好饱", "吃了吗",
            "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈", "吃哩甚", "可以", "不可以",
            "啥", "没有", "什么", "不是", "什么鬼", "困", "对", "不知道", "算了", "66666", "哭了", "笑了", "笑死", "笑死了", "凶死了",
            "嗯", "哦", "好", "没事", "ok", "是吗？", "哈哈", "哈哈哈", "呜呜", "不行", "不想", "难受", "起床啦", "好饱", "吃了吗",
            "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈", "吃哩甚", "可以", "不可以",
            "啥", "没有", "什么", "不是", "什么鬼", "困", "对", "不知道", "算了", "66666", "哭了", "笑了", "笑死", "笑死了", "凶死了",
            "一个幽灵，共产主义的幽灵，在欧洲游荡。为了对这个幽灵进行神圣的围剿，旧欧洲的一切势力，教皇和沙皇、梅特涅和基佐、法国的激进派和德国的警察，都联合起来了。",
            "有哪一个反对党不被它的当政的敌人骂为共产党呢？又有哪一个反对党不拿共产主义这个罪名去回敬更进步的反对党人和自己的反动敌人呢？",
            "从这一事实中可以得出两个结论：\n" +
                    "共产主义已经被欧洲的一切势力公认为一种势力；\n" +
                    "现在是共产党人向全世界公开说明自己的观点、自己的目的、自己的意图并且拿党自己的宣言来反驳关于共产主义幽灵的神话的时候了。",
            "为了这个目的，各国共产党人集会于伦敦，拟定了如下的宣言，用英文、法文、德文、意大利文、弗拉芒文和丹麦文公布于世。",
            "至今一切社会的历史都是阶级斗争的历史。\n" +
                    "自由民和奴隶、贵族和平民、领主和农奴、行会师傅和帮工，一句话，压迫者和被压迫者，始终处于相互对立的地位，进行不断的、有时隐蔽有时公开的斗争，而每一次斗争的结局是整个社会受到革命改造或者斗争的各阶级同归于尽。\n" +
                    "在过去的各个历史时代，我们几乎到处都可以看到社会完全划分为各个不同的等级，看到社会地位分成的多种多样的层次。在古罗马，有贵族、骑士、平民、奴隶，在中世纪，有封建主、臣仆、行会师傅、帮工、农奴，而且几乎在每一个阶级内部又有一些特殊的阶层。\n" +
                    "从封建社会的灭亡中产生出来的现代资产阶级社会并没有消灭阶级对立。它只是用新的阶级、新的压迫条件、新的斗争形式代替了旧的。",
            "但是，我们的时代，资产阶级时代，却有一个特点：它使阶级对立简单化了。整个社会日益分裂为两大敌对的阵营，分裂为两大相互直接对立的阶级：资产阶级和无产阶级。\n" +
                    "从中世纪的农奴中产生了初期城市的城关市民；从这个市民等级中发展出最初的资产阶级分子。\n" +
                    "美洲的发现、绕过非洲的航行，给新兴的资产阶级开辟了新天地。东印度和中国的市场、美洲的殖民化、对殖民地的贸易、交换手段和一般的商品的增加，使商业、航海业和工业空前高涨，因而使正在崩溃的封建社会内部的革命因素迅速发展。\n" +
                    "以前那种封建的或行会的工业经营方式已经不能满足随着新市场的出现而增加的需求了。工场手工业代替了这种经营方式。行会师傅被工业的中间等级排挤掉了；各种行业组织之间的分工随着各个作坊内部的分工的出现而消失了。",
            "但是，市场总是在扩大，需求总是在增加。甚至工场手工业也不再能满足需要了。于是，蒸汽和机器引起了工业生产的革命。现代大工业代替了工场手工业；工业中的百万富翁，一支一支产业大军的首领，现代资产者，代替了工业的中间等级。\n" +
                    "大工业建立了由美洲的发现所准备好的世界市场。世界市场使商业、航海业和陆路交通得到了巨大的发展。这种发展又反过来促进了工业的扩展，同时，随着工业、商业、航海业和铁路的扩展，资产阶级也在同一程度上得到发展，增加自己的资本，把中世纪遗留下来的一切阶级都排挤到后面去。\n" +
                    "由此可见，现代资产阶级本身是一个长期发展过程的产物，是生产方式和交换方式的一系列变革的产物。",
            "资产阶级的这种发展的每一个阶段，都伴随着相应的政治上进展。它在封建主统治下是被压迫的等级，在公社里是武装的和自治的团体，在一些地方组成独立的城市共和国，在另一些地方组成君主国中的纳税的第三等级；后来，在工场手工业时期，它是等级制君主国或专制君主国中同贵族抗衡的势力，而且是大君主国的主要基础；最后，从大工业和世界市场建立的时候起，它在现代的代议制国家里夺得了独占的政治统治。现代的国家政权不过是管理整个资产阶级的共同事务的委员会罢了。\n" +
                    "资产阶级在历史上曾经起过非常革命的作用。",
            "资产阶级在它已经取得了统治的地方把一切封建的、宗法的和田园诗般的关系都破坏了。它无情地斩断了把人们束缚于天然尊长的形形色色的封建羁绊，它使人和人之间除了赤裸裸的利害关系，除了冷酷无情的“现金交易”，就再也没有任何别的联系了。它把宗教虔诚、骑士热忱、小市民伤感这些情感的神圣发作，淹没在利己主义打算的冰水之中。它把人的尊严变成了交换价值，用一种没有良心的贸易自由代替了无数特许的和自力挣得的自由。总而言之，它用公开的、无耻的、直接的、露骨的剥削代替了由宗教幻想和政治幻想掩盖着的剥削。\n" +
                    "资产阶级抹去了一切向来受人尊崇和令人敬畏的职业的神圣光环。它把医生、律师、教士、诗人和学者变成了它出钱招雇的雇佣劳动者。\n" +
                    "资产阶级撕下了罩在家庭关系上的温情脉脉的面纱，把这种关系变成了纯粹的金钱关系。\n" +
                    "资产阶级揭示了，在中世纪深受反动派称许的那种人力的野蛮使用，是以极端怠惰作为相应补充的。它第一个证明了，人的活动能够取得什么样的成就。它创造了完全不同于埃及金字塔、罗马水道和哥特式教堂的奇迹；它完成了完全不同于民族大迁徙和十字军东征的远征。\n" +
                    "资产阶级除非对生产工具，从而对生产关系，从而对全部社会关系不断地进行革命，否则就不能生存下去。反之，原封不动地保持旧的生产方式，却是过去的一切工业阶级生存的首要条件。生产的不断变革，一切社会状况不停的动荡，永远的不安定和变动，这就是资产阶级时代不同于过去一切时代的地方。一切固定的僵化的关系以及与之相适应的素被尊崇的观念和见解都被消除了，一切新形成的关系等不到固定下来就陈旧了。一切等级的和固定的东西都烟消云散了，一切神圣的东西都被亵渎了。人们终于不得不用冷静的眼光来看他们的生活地位、他们的相互关系。",
        )

        private fun createMessageList(partnerId: Long): List<Message> {
            val size = 100
            val list = ArrayList<Message>(size)
            repeat(size) {
                val m = Message(
                    random.nextLong(),
                    partnerId,
                    fakeDate(),
                    messages.random(),
                    random.nextBoolean()
                )
                list.add(m)
            }
            return list
        }

        private fun fakeDate(): Long {
            return DateUtil.now() - when (random.nextInt(10)) {
                0, 1 -> {
                    random.nextLong(86400000)
                }
                2, 3, 4 -> {
                    random.nextLong(86400000L * 3)
                }
                5, 6, 7 -> {
                    random.nextLong(86400000L * 30)
                }
                8, 9 -> {
                    random.nextLong(86400000L * 365)
                }
                else -> {
                    86400000L * 365 + random.nextLong(86400000L * 365 * 3)
                }
            }
        }
    }
}
